package com.gitee.yongzhuzl.commonutil.util.cookie;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * description: cookie相关工具类2（适合tomcat8.5版本及以上的情况，包含tomcat8.5版本）
 * @author 朱正磊
 * @date 2019-07-19 16:23:14
 */
public class CookieUtil2 {

    private static final Logger log = LoggerFactory.getLogger(CookieUtil2.class);

    /**
     * description: 得到Cookie的值（因为没有进行编码所以不需要进行解码）
     * @author 朱正磊
     * @date 2019-07-19 16:25:47
     * @param request 请求对象
     * @param cookieName cookie名称
     * @return 返回cookie的值
     */
    public static String getCookieValue(HttpServletRequest request, String cookieName) {
        return getCookieValue(request, cookieName, false);
    }

    /**
     * description: 得到Cookie的值
     * @author 朱正磊
     * @date 2019-07-19 16:26:58
     * @param request 请求对象
     * @param cookieName cookie名称
     * @param isDecoder 是否需要进行解码，true表示需要解码（默认UTF-8进行解码），false表示不需要解码
     * @return 返回cookie的值
     */
    public static String getCookieValue(HttpServletRequest request, String cookieName, boolean isDecoder) {
        return CookieUtil.getCookieValue(request, cookieName, isDecoder);
    }

    /**
     * description: 得到Cookie的值（因为有进行编码所以需要进行解码，解码方式根据实际编码方式选择）
     * @author 朱正磊
     * @date 2019-07-19 16:31:10
     * @param request 请求对象
     * @param cookieName cookie名称
     * @param encodeString 编码方式
     * @return 返回cookie的值
     */
    public static String getCookieValue(HttpServletRequest request, String cookieName, String encodeString) {
        return CookieUtil.getCookieValue(request, cookieName, encodeString);
    }

    /**
     * description: 设置Cookie的值（不设置生效时间默认浏览器关闭即失效）（不进行编码）
     * @author 朱正磊
     * @date 2019-07-19 16:33:32
     * @param request 请求对象
     * @param response 响应对象
     * @param cookieName cookie名称
     * @param cookieValue cookie值
     */
    public static void setCookie(HttpServletRequest request, HttpServletResponse response,
                                 String cookieName, String cookieValue) {
        setCookie(request, response, cookieName, cookieValue, -1);
    }

    /**
     * description: 设置Cookie的值（设置生效时间）（不进行编码）
     * @author 朱正磊
     * @date 2019-07-19 16:37:16
     * @param request 请求对象
     * @param response 响应对象
     * @param cookieName cookie名称
     * @param cookieValue cookie值
     * @param cookieMaxAge 生效时间（单位秒）
     */
    public static void setCookie(HttpServletRequest request, HttpServletResponse response,
                                 String cookieName, String cookieValue, int cookieMaxAge) {
        setCookie(request, response, cookieName, cookieValue, cookieMaxAge, false);
    }

    /**
     * description: 设置Cookie的值（不设置生效时间默认浏览器关闭即失效）（进行编码，默认UTF-8编码）
     * @author 朱正磊
     * @date 2019-07-19 16:40:27
     * @param request 请求对象
     * @param response 响应对象
     * @param cookieName cookie名称
     * @param cookieValue cookie值
     * @param isEncode 是否进行编码：true表示进行编码（默认UTF-8进行编码），false则表示不进行编码
     */
    public static void setCookie(HttpServletRequest request, HttpServletResponse response,
                                 String cookieName, String cookieValue, boolean isEncode) {
        setCookie(request, response, cookieName, cookieValue, -1, isEncode);
    }

    /**
     * description: 设置Cookie的值（设置生效时间）（进行编码，默认UTF-8编码）
     * @author 朱正磊
     * @date 2019-07-19 16:44:35
     * @param request 请求对象
     * @param response 响应对象
     * @param cookieName cookie名称
     * @param cookieValue cookie值
     * @param cookieMaxAge 生效时间（单位秒）
     * @param isEncode 是否进行编码：true表示进行编码（默认UTF-8进行编码），false则表示不进行编码
     */
    public static void setCookie(HttpServletRequest request, HttpServletResponse response,
                                 String cookieName, String cookieValue, int cookieMaxAge, boolean isEncode) {
        doSetCookie(request, response, cookieName, cookieValue, cookieMaxAge, isEncode);
    }

    /**
     * description: 设置Cookie的值（设置生效时间）（根据指定编码方式进行编码）
     * @author 朱正磊
     * @date 2019-07-19 16:52:33
     * @param request 请求对象
     * @param response 响应对象
     * @param cookieName cookie名称
     * @param cookieValue cookie值
     * @param cookieMaxAge 生效时间（单位秒）
     * @param encodeString 指定编码方式
     */
    public static void setCookie(HttpServletRequest request, HttpServletResponse response,
                                 String cookieName, String cookieValue, int cookieMaxAge, String encodeString) {
        doSetCookie(request, response, cookieName, cookieValue, cookieMaxAge, encodeString);
    }

    /**
     * description: 删除cookie（将cookie的值设置为空）（当浏览器关闭时自动删除）
     * @author 朱正磊
     * @date 2019-07-19 18:16:25
     * @param request 请求对象
     * @param response 响应对象
     * @param cookieName cookie名称
     */
    public static void deleteCookie(HttpServletRequest request, HttpServletResponse response, String cookieName) {
        // setMaxAge方法设置cookie经过多长秒后被删除。如果参数是0，就说明立即删除。如果是负数就表明当浏览器关闭时自动删除。
        doSetCookie(request, response, cookieName, "", -1, false);
    }

    /**
     * description: 设置cookie的值（设置生效时间）（进行编码，默认UTF-8编码）
     * @author 朱正磊
     * @date 2019-07-19 17:02:51
     * @param request 请求对象
     * @param response 响应对象
     * @param cookieName cookie名称
     * @param cookieValue cookie值
     * @param cookieMaxAge 生效时间（单位秒）
     * @param isEncode 是否进行编码：true表示进行编码（默认UTF-8进行编码），false则表示不进行编码
     */
    public static void doSetCookie(HttpServletRequest request,
                                    HttpServletResponse response,
                                    String cookieName, String cookieValue,
                                    int cookieMaxAge, boolean isEncode) {
        CookieUtil.doSetCookie(request, response, cookieName, cookieValue, cookieMaxAge, isEncode);
    }

    /**
     * description: 设置cookie的值（设置生效时间）（根据指定编码方式进行编码）
     * @author 朱正磊
     * @date 2019-07-19 16:59:59
     * @param request 请求对象
     * @param response 响应对象
     * @param cookieName cookie名称
     * @param cookieValue cookie值
     * @param cookieMaxAge 生效时间（单位秒）
     * @param encodeString 指定编码方式
     */
    public static void doSetCookie(HttpServletRequest request,
                                    HttpServletResponse response,
                                    String cookieName, String cookieValue,
                                    int cookieMaxAge, String encodeString) {
        CookieUtil.doSetCookie(request, response, cookieName, cookieValue, cookieMaxAge, encodeString);
    }

    /**
     * description: 得到cookie的域名
     * @author 朱正磊
     * @date 2019-07-19 16:59:17
     * @param request 请求对象
     * @return 返回cookie的域名
     */
    private static String getDomainName(HttpServletRequest request) {
        String domainName;
        String serverName = request.getRequestURL().toString();
        if (serverName.isEmpty()) {
            domainName = "";
        } else {
            serverName = getServerName(serverName);
            final String[] domains = serverName.split("\\.");
            int len = domains.length;
            if (len > 3) {
                domainName = domains[len - 3] + "." + domains[len - 2] + "." + domains[len - 1];
            } else if (len > 1) {
                domainName = domains[len - 2] + "." + domains[len - 1];
            } else {
                domainName = serverName;
            }
        }
        if (domainName.indexOf(":") > 0) {
            String[] ary = domainName.split(":");
            domainName = ary[0];
        }
        return domainName;
    }

    /**
     * description: 获取服务名
     * @author 朱正磊
     * @date 2025-08-30 15:04:36
     * @param serverName 服务名
     * @return 返回服务名
     */
    private static String getServerName(String serverName) {
        serverName = serverName.toLowerCase();
        serverName = serverName.substring(7);
        final int end = serverName.indexOf("/");
        serverName = serverName.substring(0, end);
        return serverName;
    }

}
